home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / AMIGA / AMICUS / AMICUS01.ADF / C / quick.c < prev    next >
C/C++ Source or Header  |  1985-12-29  |  1KB  |  51 lines

  1.  
  2. #include <stdio.h>
  3.  
  4. /* quicksort module  --  S. Harrison  8/84 */
  5. /* sorts strings pointed to by base[lo] .. base[hi] into increasing order */
  6.  
  7. quick( lo, hi, base )
  8. int lo, hi;
  9. char *base[];
  10. {
  11.    int i, j, piv;
  12.    char *pivot;
  13.  
  14.    if( lo < hi ) {
  15.       piv = ( lo + hi ) / 2;            /* select center pivot */
  16.       i = lo; 
  17.       j = hi; 
  18.       pivot = base[piv];
  19.       while( i < j ) {
  20.          while( i < j && strcmp( base[i], pivot ) <= 0 )
  21.             i++;
  22.          while( j < i && strcmp( base[j], pivot ) >= 0 )
  23.             j--;
  24.          if( i < j ) {
  25.             swap( &base[i], &base[j] );
  26.          }
  27.       }
  28.       if( piv < i && strcmp( base[i], pivot ) > 0 ) i--;
  29.       swap( &base[i], base[piv] );              /* put pivot element in */
  30.                                                 /* correct "middle" position */
  31.       if( i - lo <= hi - i ) {
  32.          quick( lo, i - 1, base );
  33.          quick( i + 1, hi, base );
  34.       }                                         /* do shortest subset first */
  35.       else {
  36.          quick( i + 1, hi, base );
  37.          quick( lo, i - 1, base );
  38.       }
  39.    }
  40. }
  41.  
  42. swap( x, y )                                    /* swap a pair of pointers */
  43. char *x[], *y[];
  44. {    
  45.    char *temp; 
  46.    temp = *x; 
  47.    *x = *y; 
  48.    *y = temp; 
  49. }
  50.  
  51.